const cloud = require('wx-server-sdk');
const ort = require('onnxruntime-web');
const Jimp = require('jimp');//用JS库来进行图片预处理
const path = require('path');
//改动之后要选择上传并且部署（云端安装依赖）
// 初始化时强制指定环境
cloud.init({
  env: 'lvtengweishi-4gvg0d2h59537d91' // 替换为你的环境 ID
});
//获取本地传过来的fileID
exports.main = async (event, context) => {
  const { fileID } = event;

  try {
    // 1. 下载云存储图片
    console.log('开始下载文件:', fileID);
    const downloadResult = await cloud.downloadFile({
      fileID: fileID,
      timeout: 5000
    });

    if (!downloadResult.fileContent) {
      throw new Error('文件内容为空，请检查 fileID 是否正确');
    }

    const buffer = downloadResult.fileContent;
    console.log('文件大小:', buffer.length, 'bytes');

    // 2. 预处理图片,调用预处理函数
    console.log('开始预处理...');
    const imageData = await preprocessImage(buffer);

    // 3. 加载模型
    console.log('加载模型...');
    const modelPath = path.join(__dirname, 'models', 'pest_detection.onnx');
    // 调用模型接口
    const session = await ort.InferenceSession.create(modelPath);

    // 4. 推理
    console.log('开始推理...');
    const feeds = { input: imageData };
    // 将图片数据传给模型，我决定这里可以输出查看图片预处理情况
    // console.log("查看图片预处理情况，看看有没有问题",imageData);
    const results = await session.run(feeds);

    // 5. 返回结果
    return { 
      output: Array.from(results.output.data)
    };

  } catch (err) {
    console.error('完整错误堆栈:', err.stack || err);
    return { 
      error: err.message,
      stack: err.stack // 开发阶段返回堆栈信息
    };
  }
};

// 图像预处理函数,查看这里的预处理情况是否有问题
async function preprocessImage(buffer) {
  console.log('进入图像预处理函数');
  const image = await Jimp.read(buffer);
  console.log('图片读取成功，原始尺寸:', image.bitmap.width, 'x', image.bitmap.height);
  image.resize(256, 256); // 调整图像大小
  console.log('图片调整为 256x256 尺寸');
  const imageData = new Float32Array(1 * 3 * 256 * 256);
  
  image.scan(0, 0, image.bitmap.width, image.bitmap.height, (x, y, idx) => {
    const pixel = Jimp.intToRGBA(image.getPixelColor(x, y));
    imageData[y * 256 + x] = pixel.r / 255.0; // R
    imageData[256 * 256 + y * 256 + x] = pixel.g / 255.0; // G
    imageData[2 * 256 * 256 + y * 256 + x] = pixel.b / 255.0; // B
  });

  console.log('图像像素数据处理完成');
  return new ort.Tensor('float32', imageData, [1, 3, 256, 256]);
}